#include<iostream>
#include<cstring>
using namespace std;
const int N=1e3+10;
struct node
{
    int vi;//体积
    int wi;//价值
}nums[N];
int Value[N][N];
int main()
{
    int n,v;cin>>n>>v;
    for(int i=1;i<=n;i++)
    {
        cin>>nums[i].vi>>nums[i].wi;
    }

    //在n个物品中选出背包所能装取的最大价值
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=v;j++)
        {
            //当背包容量比i物品容量大的时候，有两种选择取最大值
            //1.选择当前物品，Value[j-nums[i].vi][i-1]+nums[i].wi 
            //2.不选择当前物品，Value[j][i-1]

            //容量不足时，不能选择当前物品
            Value[j][i]=Value[j][i-1];
            if(j>=nums[i].vi)
            {
                Value[j][i]=max(Value[j][i],
                    Value[j-nums[i].vi][i-1]+nums[i].wi);
            }
        }
    }
    cout<<Value[v][n]<<endl;


    memset(Value,-1,sizeof(Value));
    for(int i=0;i<=n;i++)
        Value[0][i] = 0;
    //背包装满所能装取的最大价值
    for(int i=1;i<=n;i++)
    {
        Value[0][i] = 0;
        for(int j=1;j<=v;j++)
        {
            Value[j][i]=Value[j][i-1];
            if(j-nums[i].vi>=0&&Value[j-nums[i].vi][i-1]!=-1)
            {
                Value[j][i]=max(Value[j][i],
                    Value[j-nums[i].vi][i-1]+nums[i].wi);
            }
        }
    }
    cout<<(Value[v][n]==-1?0:Value[v][n])<<endl;
}